package jiang.Algorithm;

/**
 * @ClassName DigitToChinese
 * @Description: 阿拉伯数字转汉字
 * @Author jiangshitao
 * @Date 2023/1/31
 *
 * 想不通过分组来实现，但实在是有点写不出来
 */
public class DigitToChinese {
    private static final String[] DIGITS = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
    private static final String[] UNITS_1 = {"", "十", "百", "千", "", "十", "百", "千", "", "十", "百", "千"};
    private static final String[] UNITS_2 = {"", "万", "亿"};


    /**
     * 数字转汉字
     * @param digit 需转换的数字
     * @return 转换后的汉字
     */
    public static String converter(Long digit) {
        // 用来接收转换后的结果
        StringBuilder result = new StringBuilder();
        // 将输入的数字转换为字符数组存储
        String digitString = String.valueOf(digit);
        char[] digitChars = digitString.toCharArray();
        // 获取输入数字的长度
        int digitLength = digitChars.length;
        // 标记0出现的次数
        int z = 0;
        // 标记数字的单位下标
        int temp = 1;
        // 长度可能的范围在1-12之间
        // 当长度是4，8，12时比较简单
        // 当长度超过4才需要单位2

        for (char c : digitChars) {
            // 通过数字与下标的对应找出汉字
            int digitsIndex = Character.getNumericValue(c);
            if(digitsIndex == 0) {
                z++;
                if (z >= 2) {
                    continue;
                }
            }
            // 拼接数字
            result.append(DIGITS[digitsIndex]);
            // 当不为零的时候才拼接单位
            if (digitsIndex != 0) {
                result.append(UNITS_1[digitLength-(temp++)]);
            } else {
                // 单位下标要继续增长
                temp++;
            }
            // 获取对应的单位2
            int units2;
            switch (digitLength/4) {
                default:
                    units2 = 0;
                    break;
                case 2:
                    units2 = 1;
                    break;
                case 3:
                    units2 = 2;
                    break;
            }
            if (temp == digitLength%4) {
                result.append(UNITS_2[units2]);
            }
        }
        /*
          当出现多个0的时候要特殊处理
          当大小超过万的时候要特殊处理
         */
        return result.toString();
    }

    /**
     * 去除多余的零
     * @param result 字符串
     */
    public static void removeZero(StringBuilder result) {
        // 去除多余的零
        if ("零".equals(result.substring(result.length()-1))) {
            result.deleteCharAt(result.length()-1);
        }
    }

    public static void main(String[] args) {
        Long l = 10000L;
        System.out.println(converter(l));
    }

}
